import type { RouteRecordRaw } from 'vue-router';
//import { storeToRefs } from 'pinia';
import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index';
import { dynamicRoutes, notFoundAndNoPower } from '/@/router/route';
import pinia from '/@/stores/index';
import { Session } from '/@/utils/storage';
import { useUserInfo } from '/@/stores/userInfo';
import { useRoutesList } from '/@/stores/routesList';
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
import { NextLoading } from '/@/utils/loading';
import { useMenuApi } from '/@/api/menu/index';
import { useRequestOldRoutes } from '../stores/requestOldRoutes';
import { backEndComponent } from './backEnd';
//import { ElMessage } from 'element-plus';

// 前端控制路由
// 引入 api 请求接口
const menuApi = useMenuApi();
/**
 * 前端控制路由：初始化方法，防止刷新时路由丢失
 * @method  NextLoading 界面 loading 动画开始执行
 * @method useUserInfo(pinia).setUserInfos() 触发初始化用户信息 pinia
 * @method setAddRoute 添加动态路由
 * @method setFilterMenuAndCacheTagsViewRoutes 设置递归过滤有权限的路由到 pinia routesList 中（已处理成多级嵌套路由）及缓存多级嵌套数组处理后的一维数组
 */
export async function initControlRoutes() {
	// 界面 loading 动画开始执行
	if (window.nextLoading === undefined) NextLoading.start();
	// 无 token 停止执行下一步
	if (!Session.get('token')) return true;
	// 触发初始化用户信息 pinia
	// https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
	await useUserInfo().setUserInfos();
	await useUserInfo().setConstList();
	await useUserInfo().setDictList();

	// 获取路由菜单数据
	const res : AjaxResult = await menuApi.getAdminMenu();
	if(res.success===false){
		return Promise.resolve(true);
	}
	const menuData = res.data;
	
	// 无登录权限时，添加判断
	// https://gitee.com/lyt-top/vue-next-admin/issues/I64HVO
	if (menuData.length <= 0) return Promise.resolve(true);
	// eslint-disable-next-line no-console
	//console.log('res.data:'+JSON.stringify(menuData.data));
	// 存储接口原始路由（未处理component），根据需求选择使用
	useRequestOldRoutes().setRequestOldRoutes(JSON.parse(JSON.stringify(menuData)));
	// 处理路由（component），替换 dynamicRoutes（/@/router/route）第一个顶级 children 的路由
	dynamicRoutes[0].children = await backEndComponent(menuData);
	// eslint-disable-next-line no-console
	//console.log('dynamicRoutes:'+JSON.stringify(dynamicRoutes));
	// 添加动态路由
	await setAddRoute();
	// 设置路由到 pinia routesList 中（已处理成多级嵌套路由）及缓存多级嵌套数组处理后的一维数组
	await setFilterMenuAndCacheTagsViewRoutes();

	// menuApi.getAdminMenu().then(async (_data:AjaxResult)=>{
	// 	if(_data.success===true){
	// 		let res=_data.data;
	// 		if(res && res.data && res.data.length>0){
	// 			// eslint-disable-next-line no-console
	// 			console.log('data:'+JSON.stringify(res.data));
	// 			useRequestOldRoutes().setRequestOldRoutes(res.data);
	// 			dynamicRoutes[0].children = await backEndComponent(res.data);
	// 			//dynamicRoutes[0].children = await backEndComponent(res.data);
	// 			// 添加动态路由
	// 			await setAddRoute();
	// 			// 设置路由到 pinia routesList 中（已处理成多级嵌套路由）及缓存多级嵌套数组处理后的一维数组
	// 			await setFilterMenuAndCacheTagsViewRoutes();
	// 		}
	// 		else{
	// 			// eslint-disable-next-line no-console
	// 			console.log('res:'+res);
	// 			return Promise.resolve(true);
	// 		}
	// 	}
	// 	else{
	// 		ElMessage.warning('获取菜单数据失败：' + _data.msg);
	// 	}
	// });

	// // 无登录权限时，添加判断
	// // https://gitee.com/lyt-top/vue-next-admin/issues/I64HVO
	// if (useUserInfo().userInfos.roles.length <= 0) 
    //     return Promise.resolve(true);
    // else{
    //     // 添加动态路由
    //     await setAddRoute();
    //     // 设置递归过滤有权限的路由到 pinia routesList 中（已处理成多级嵌套路由）及缓存多级嵌套数组处理后的一维数组
    //     await setFilterMenuAndCacheTagsViewRoutes();
    //     return false;
    // }
}

/**
 * 设置路由到 pinia routesList 中（已处理成多级嵌套路由）及缓存多级嵌套数组处理后的一维数组
 * @description 用于左侧菜单、横向菜单的显示
 * @description 用于 tagsView、菜单搜索中：未过滤隐藏的(isHide)
 */
export async function setFilterMenuAndCacheTagsViewRoutes() {
	const storesRoutesList = useRoutesList(pinia);
	storesRoutesList.setRoutesList(dynamicRoutes[0].children as any);
	setCacheTagsViewRoutes();
}
/**
 * 缓存多级嵌套数组处理后的一维数组
 * @description 用于 tagsView、菜单搜索中：未过滤隐藏的(isHide)
 */
export function setCacheTagsViewRoutes() {
	const storesTagsView = useTagsViewRoutes(pinia);
	storesTagsView.setTagsViewRoutes(formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes))[0].children);
}
/**
 * 处理路由格式及添加捕获所有路由或 404 Not found 路由
 * @description 替换 dynamicRoutes（/@/router/route）第一个顶级 children 的路由
 * @returns 返回替换后的路由数组
 */
export function setFilterRouteEnd() {
	let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes));
	// notFoundAndNoPower 防止 404、401 不在 layout 布局中，不设置的话，404、401 界面将全屏显示
	// 关联问题 No match found for location with path 'xxx'
	filterRouteEnd[0].children = [...filterRouteEnd[0].children, ...notFoundAndNoPower];
	return filterRouteEnd;
}
/**
 * 添加动态路由
 * @method router.addRoute
 * @description 此处循环为 dynamicRoutes（/@/router/route）第一个顶级 children 的路由一维数组，非多级嵌套
 * @link 参考：https://next.router.vuejs.org/zh/api/#addroute
 */
export async function setAddRoute() {
	await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {
		router.addRoute(route);
	});
}